const express = require('express');
const cors = require('cors');
const app = express();
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');

// 导入路由
const drugRoutes = require('./routes/drugRoutes');
const orderRoutes = require('./routes/orderRoutes');
const userRoutes = require('./routes/userRoutes');
const adminRoutes = require('./routes/admin');
const authRoutes = require('./routes/authRoutes');
const cartRoutes = require('./routes/cartRoutes');

// 中间件
app.use(cors()); // 启用CORS
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 托管静态文件，使上传的图片可访问
app.use('/uploads', express.static('uploads'));

// 认证中间件
const authenticateToken = (req, res, next) => {
  try {
    const authHeader = req.headers['authorization'];
    const token = authHeader && authHeader.split(' ')[1];

    console.log('认证请求:', {
      path: req.path,
      method: req.method,
      hasToken: !!token
    });

    if (!token) {
      return res.status(401).json({ message: '未提供认证令牌' });
    }

    jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key', (err, user) => {
      if (err) {
        console.error('Token验证错误:', err);
        if (err.name === 'TokenExpiredError') {
          return res.status(403).json({ message: '认证令牌已过期' });
        }
        return res.status(403).json({ message: '无效的认证令牌' });
      }
      console.log('认证成功:', { userId: user.id, role: user.role });
      req.user = user;
      next();
    });
  } catch (error) {
    console.error('认证中间件错误:', error);
    res.status(500).json({ message: '服务器错误' });
  }
};

// 认证相关路由（不需要token）
app.use('/api/auth', authRoutes);

// 需要认证的路由
app.use('/api/drugs', authenticateToken, drugRoutes);
app.use('/api/cart', authenticateToken, cartRoutes);
app.use('/api/orders', authenticateToken, orderRoutes);
app.use('/api/users', authenticateToken, userRoutes);

// 注册管理员路由（需要认证）
app.use('/api/admin', authenticateToken, adminRoutes);

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ message: '服务器错误' });
});

// 设置端口号
const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
});